package com.demo.day716;

import sun.reflect.generics.tree.ByteSignature;

import java.util.Arrays;

/**
 * @author PJM
 * @date 2021/7/15 0015 - 16:16
 */
public class StringDemo {

      /*
                 A. 实现将钱币的数字形式，通过程序转变成银行的汉字形式
                       1. 首先寻找或指定数字形式与对应的汉字的一种关系
                       2. “零壹贰叁肆伍陆柒捌玖”，用于数字与汉字的转换
                        ---》将字符串拆分成两部分，按照小数点进行拆分
                       3. 遍历数字形式的字符串，将数字转变成数值形式当作索引来用
                       4. 同样定义单位的字符串，来进行相应的转换
                       5. “圆拾佰仟万拾佰仟亿拾佰仟”
                       6. 找出数字与单位的对应关系   123    0   佰（2）    1   拾（1）  length()-1-i，这个值，可以当作单位字符串的索引
                       7. 如果将字符数字，转变成数值 ‘0’0   String.valueOf(ch)   '0'-'0'
                       8. 定义字符串保留结果
            */

      public static void changeNumber(String number){
            String charactorStr = "零壹贰叁肆伍陆柒捌玖";
            String unitStr = "圆拾佰仟万拾佰仟亿拾佰仟";
            String[] parts = number.split("\\.");
            String result = "";
            for (int i = 0; i < parts[0].length(); i++) {
                  char ch = parts[0].charAt(i);
                  int index = ch - '0';
                  // 先拼接汉字，再拼接单位  123
                  result = result.concat(String.valueOf(charactorStr.charAt(index)));
                  index = parts[0].length()-i-1;
                  result = result.concat(String.valueOf(unitStr.charAt(index)));
            }
            if(parts.length>1){
                  result = result.concat("点");
                  for (int i = 0; i < parts[1].length(); i++) {
                        char ch = parts[1].charAt(i);
                        int index = ch - '0';
                        result = result.concat(String.valueOf(charactorStr.charAt(index)));
                  }
            }
            System.out.println(number+"转变成银行格式的汉字为："+result);
      }


      public static void subString(String value, int byteLength){
            /*
                  1. 遍历字符串，将获得的字符，转变成单个字符的字符串
                  2. 转变成字符串之后，就可以调用字符串的getBytes()方法
                  3. 用字节数组的长度，跟byte Length做比较，如果小于byteLength表示这个字符可以存储的开
                  4. 存储了字符后，意味剩余的存储空间减少，byteLength-上面的字节数组的值
                  5. 重复上面的操作，将存到的字符拼接到结果中
                  6. 比较的时候，如果长度不够了，跳出循环就可以
             */
            String result = "";
            for (int i = 0; i < value.length(); i++) {
                  String str = String.valueOf(value.charAt(i));
                  byte[] bts = str.getBytes();
                  if(bts.length<=byteLength){
                        result = result.concat(str);
                        byteLength = byteLength - bts.length;
                  }else{
                        break;
                  }
            }
            System.out.println(result);
      }

      public static void changeWord(String language){
            /*
                  1. 对接收到的字符串language做匹配，要去匹配是A语言还是B语言
                  2. 判断接收到的字符串是否包含"_"，如果包含按照B语言去匹配，否则按照A语言去匹配 if  else 分支
                  3. 分支一：
                          B语言的匹配结果：true   false  ，
                          假设匹配结果是true，然后开始匹配，对接收的字符串进行遍历
                          只能包含小写字符以及下划线，否则匹配失败，下划线不能连续出现，下划线不能出现在最后
                          如果结果是false，输出error
                          true，转义，遍历字符串遇到了下划线，将下划线去掉，将后面的一个字符转变成大写
                  4. 分支二
                          A语言的标识符，匹配结果：true  false
                          假设是true，然后开始匹配，对字符串进行遍历
                          只能包含小写，大写字符，如果遇到其他字符，跳出循环，结果为false
                          true，开始转义，遍历字符串，将大写转变成小写，同时在前面添加一个下划线
             */
            char one = language.charAt(0);
            if(one>='a' && one<='z'){
                  boolean flag = language.contains("_");
                  if(flag){
                        boolean ok = true;
                        for (int i = 0; i < language.length(); i++) {
                              char ch = language.charAt(i);
                              if(ch == '_'){
                                    // 看下一个字符是否是下划线，或者当前位置是否是最后一个字符
                                    if(i==language.length()-1 || language.charAt(i+1)=='_'){
                                          ok = false;
                                          break;
                                    }
                              }else if(ch<'a' || ch>'z'){
                                    ok = false;
                                    break;
                              }
                        }
                        if(ok){ // 开始转义
                              String result = "";
                              for (int i = 0; i < language.length(); i++) {
                                    char ch = language.charAt(i);
                                    if(ch == '_'){
                                          i = i + 1;
                                          ch = language.charAt(i);
                                          result = result.concat(String.valueOf(ch).toUpperCase());
                                    }else{
                                          result = result.concat(String.valueOf(ch));
                                    }
                              }
                              System.out.println("B语言标识符："+language+"，转换成A语言的标识符为："+result);
                        }else {
                              System.out.println("error");
                        }
                  }else{
                        boolean ok = true;
                        for(int i=0; i<language.length(); i++){
                              char ch = language.charAt(i);
                              if( !((ch>='a' && ch<='z')  ||  (ch>='A' && ch<='Z'))){
                                    ok = false;
                                    break;
                              }
                        }
                        if(ok){ // 转义
                              String result = "";
                              for (int i = 0; i < language.length(); i++) {
                                    char ch = language.charAt(i);
                                    if(ch>='A' && ch<='Z'){
                                          result = result.concat("_").concat(String.valueOf(ch).toLowerCase());
                                    }else {
                                          result = result.concat(String.valueOf(ch));
                                    }
                              }
                              System.out.println("A语言标识符："+language+"，转换成B语言的标识符为："+result);
                        }else {
                              System.out.println("error");
                        }
                  }
            }else{
                  System.out.println("error");
            }

      }

      public static void main(String[] args) {
            changeWord("pme_ok");
      }

}
